#define WTCON           0xE2700000
#define SVC_STACK       0xD0037D80
#define PS_HOLD_CONTORL 0xE010E81C

#define GPJ0CON	0xE0200240
#define GPJ0DAT	0xE0200244

#define GPD0CON 0xE02000A0
#define GPD0DAT 0xE02000A4

.global _start
_start:
    //Locked 5v power
    ldr r0,=PS_HOLD_CONTORL
    ldr r1,[r0]
    orr r1,r1,#0x300
    orr r1,r1,#0x1
    str r1,[r0]

    //Turn off watch dog
    ldr r0, =WTCON
    ldr r1, =0x0
    str r1, [r0]

    //Init clock
    bl clock_init

    //Setup svc stack
    ldr sp, =SVC_STACK

    //Turn on ichache
    mrc p15,0,r0,c1,c0,0
    orr r0,r0, #(1<<12)
    mcr p15,0,r0,c1,c0,0
	
	// 第一步：把所有引脚都设置为输出模式，代码不变
	ldr r0, =0x11111111			//r0=0x11111111 从后面的=可以看出用的是ldr伪指令，因为需要编译器来判断这个数
	ldr r1, =GPJ0CON			//r1=0xE0200240 是合法立即数还是非法立即数。一般写代码都用ldr伪指令
	str r0, [r1]				// 寄存器间接寻址。功能是把r0中的数写入到r1中的数为地址的内存中去

    ldr r0, =0x00000010         //r0=0x00000010
    ldr r1, =GPD0CON            //r1=0xE02000A0
    str r0,[r1]                 //将r0中的内容传输到r1中数所指定的地址的内存中去
	
	ldr r0, =~(1<<3)            //r0=0xFFFFFFF7
	ldr r1, =GPJ0DAT            //r1=0xE0200244
	str r0, [r1]				// 把0写入到GPJ0DAT寄存器中，引脚即输出低电平，LED点亮

    bl main

    b .
